#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <unistd.h>
#include <string.h>

struct StudentInformStruct
{
    // 成员变量。
    unsigned id;   // unsigned 就是 unsigned int
    char name[20]; // 用字符数组来保存名字。
};

#define MY_POINTER_SIZE (10)
// 动态分配内存malloc，一定要用free释放。不然内存泄露。
int main(int argc, char **argv)
{
    {
        // 指针变量可以保存一个地址。
        // malloc的参数是需要分配N个字节的大小。
        // 我们需要分配10个int数组，因为int大小是4，所以我们分配的大小是4*10=40.
        int *pointor = (int *)malloc(sizeof(int) * MY_POINTER_SIZE);
        if (pointor == NULL)
        {
            printf("[%s,%d]pointor is null!\n", __FILE__, __LINE__);
            return -1;
        }
        for (int i = 0; i < MY_POINTER_SIZE; i++)
        {
            pointor[i] = 1000 + i;
        }
        for (int i = 0; i < MY_POINTER_SIZE; i++)
        {
            printf("[%s,%d]p=%p, p[%d]=%d\n", __FILE__, __LINE__, pointor, i, pointor[i]);
        }
        // 记得释放。
        free(pointor);
        pointor = NULL;
    }

    {
        // 测试结构体。一个结构体是24字节，总空间需要分配24 * 10 = 240字节。
        struct StudentInformStruct *tmpstuds = (struct StudentInformStruct *)malloc(sizeof(struct StudentInformStruct) * 10);
        if (tmpstuds == NULL)
        {
            printf("[%s,%d]tmpstuds is null!\n", __FILE__, __LINE__);
            return -1;
        }

        tmpstuds[0].id = 0;
        // snprintf和printf差不多，只不过snprintf是输出到字符串。而printf输出到终端。
        snprintf(tmpstuds[0].name, sizeof(tmpstuds[0].name), "stud-%d", tmpstuds[0].id);
        // tmpstuds->name：对于结构体指针用->访问其成员。tmpstuds[0].id是取数组第一个元素变量，.代表获取变量成员。
        printf("[%s,%d]student-p=%p, id=%d, name=%s\n", __FILE__, __LINE__, tmpstuds, tmpstuds[0].id, tmpstuds->name);
        // 记得释放。
        free(tmpstuds);
        tmpstuds = NULL;
    }

    {
        // calloc 会初始化元素为0
        int *tmpptr = (int *)calloc(MY_POINTER_SIZE, sizeof(int));
        if (!tmpptr)
        {
            printf("[%s,%d]calloc error!\n", __FILE__, __LINE__);
            return -1;
        }
        for (int i = 0; i < MY_POINTER_SIZE; i++)
        {
            printf("[%s,%d]calloc, p=%p, p[%d]=%d\n", __FILE__, __LINE__, tmpptr, i, tmpptr[i]);
        }
        free(tmpptr);

        tmpptr = (int *)malloc(MY_POINTER_SIZE * sizeof(int));
        if (!tmpptr)
        {
            printf("[%s,%d]malloc error!\n", __FILE__, __LINE__);
            return -1;
        }
        for (int i = 0; i < MY_POINTER_SIZE; i++)
        {
            printf("[%s,%d]malloc, p=%p, p[%d]=%d\n", __FILE__, __LINE__, tmpptr, i, tmpptr[i]);
        }
        free(tmpptr);
    }
    return 1;
}
